home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / PNL Libraries / MyHistory.p < prev    next >
Text File  |  1994-09-11  |  4KB  |  180 lines

  1. unit MyHistory;
  2.  
  3. interface
  4.  
  5. {$IFC undefined THINK_Pascal}
  6.     uses
  7.         Files;
  8. {$ENDC}
  9.  
  10.     const
  11.         H_Null = $12345678;
  12.         H_FromStart = $80000000;
  13.  
  14.     function HistoryCreate (var fs: FSSpec): OSErr;
  15. { You should create the file before calling this using FSpCreate.  Any existing data will be destroyed. }
  16.     function HistoryOpen (var fs: FSSpec; var refnum: longInt): OSErr;
  17.     function HistoryFlush (refnum: longInt): OSErr;
  18.     function HistoryClose (refnum: longInt): OSErr;
  19.     function HistoryAdd (refnum: longInt; data: str255): OSErr;
  20.     function HistoryAfter (refnum: longInt; time: longInt; var id: longInt): OSErr;
  21.     function HistoryNext (refnum: longInt; var id: longInt; var time: longInt; var data: str255): OSErr;
  22.     function HistoryExpire (refnum: longInt; time: longInt): OSErr;
  23.  
  24. implementation
  25.  
  26.     uses
  27. {$IFC undefined THINK_Pascal}
  28.         Errors, 
  29. {$ENDC}
  30.         MyFileSystemUtils, MyMemory, MyMathUtils;
  31.  
  32. { File format: }
  33. { sequence of entries }
  34. { Entry format: }
  35. { time:longInt }
  36. { data:PString }
  37. { zero:byte }
  38.  
  39.     type
  40.         EntryRecord = record
  41.                 time: longInt;
  42.                 data: str255;
  43.                 zero: byte;
  44.             end;
  45.  
  46.     function HistoryCreate (var fs: FSSpec): OSErr;
  47.         var
  48.             err, oerr: OSErr;
  49.             rn: integer;
  50.     begin
  51.         err := FSpOpenDF(fs, fsRdWrPerm, rn);
  52.         if err = noErr then begin
  53.             err := SetEOF(rn, 0);
  54.             oerr := FSClose(rn);
  55.             if err = noErr then
  56.                 err := oerr;
  57.         end;
  58.         HistoryCreate := err;
  59.     end;
  60.  
  61.     function HistoryOpen (var fs: FSSpec; var refnum: longInt): OSErr;
  62.         var
  63.             err, junk: OSErr;
  64.             rn: integer;
  65.     begin
  66.         err := FSpOpenDF(fs, fsRdWrPerm, rn);
  67.         if err = noErr then begin
  68.             if err <> noErr then begin
  69.                 junk := FSClose(rn);
  70.             end;
  71.         end;
  72.         refnum := rn;
  73.         if err <> noErr then begin
  74.             refnum := H_Null;
  75.         end;
  76.         HistoryOpen := err;
  77.     end;
  78.  
  79.     function HistoryFlush (refnum: longInt): OSErr;
  80.         var
  81.             err: OSErr;
  82.             pb: ParamBlockRec;
  83.     begin
  84.         pb.ioRefNum := refnum;
  85.         err := PBFlushFileSync(@pb);
  86.         HistoryFlush := err;
  87.     end;
  88.  
  89.     function HistoryClose (refnum: longInt): OSErr;
  90.         var
  91.             err: OSErr;
  92.     begin
  93.         if refnum <> H_Null then begin
  94.             err := FSClose(refnum);
  95.         end;
  96.         HistoryClose := err;
  97.     end;
  98.  
  99.     function HistoryAdd (refnum: longInt; data: str255): OSErr;
  100.         var
  101.             err: OSErr;
  102.             er: EntryRecord;
  103.     begin
  104.         MFill(@er, SizeOf(er), 0);
  105.         GetDateTime(er.time);
  106.         er.data := data;
  107.         err := MyFSWriteAt(refnum, fsFromLEOF, 0, 6 + length(data), @er);
  108.         HistoryAdd := err;
  109.     end;
  110.  
  111.     function ReadEntry (refnum: longInt; var pos: longInt; var entry: EntryRecord): OSErr;
  112.         var
  113.             err: OSErr;
  114.     begin
  115.         err := MyFSReadAt(refnum, pos, 5, @entry);
  116.         if err = noErr then begin
  117.             err := MyFSReadAt(refnum, pos, 5 + length(entry.data), @entry);
  118.         end;
  119.         if err = noErr then begin
  120.             pos := pos + 6 + length(entry.data);
  121.         end;
  122.         ReadEntry := err;
  123.     end;
  124.  
  125.     function HistoryAfter (refnum: longInt; time: longInt; var id: longInt): OSErr;
  126.         var
  127.             err: OSErr;
  128.             pos: longInt;
  129.             entry: EntryRecord;
  130.     begin
  131.         pos := 0;
  132.         repeat
  133.             id := pos;
  134.             err := ReadEntry(refnum, pos, entry);
  135.         until (err <> noErr) or (entry.time >= time);
  136.         HistoryAfter := err;
  137.     end;
  138.  
  139.     function HistoryNext (refnum: longInt; var id: longInt; var time: longInt; var data: str255): OSErr;
  140.         var
  141.             err: OSErr;
  142.             entry: EntryRecord;
  143.     begin
  144.         err := ReadEntry(refnum, id, entry);
  145.         time := entry.time;
  146.         data := entry.data;
  147.         HistoryNext := err;
  148.     end;
  149.  
  150.     function HistoryExpire (refnum: longInt; time: longInt): OSErr;
  151.         var
  152.             err: OSErr;
  153.             src, dst, len, cnt: longInt;
  154.             buffer: packed array[1..8192] of byte;
  155.     begin
  156.         err := HistoryAfter(refnum, time, src);
  157.         if err = noErr then begin
  158.             err := GetEOF(refnum, len);
  159.             if err = noErr then begin
  160.                 len := len - src;
  161.                 dst := 0;
  162.                 while (err = noErr) & (len > 0) do begin
  163.                     cnt := Min(len, SizeOf(buffer));
  164.                     err := MyFSReadAt(refnum, src, cnt, @buffer);
  165.                     if err = noErr then begin
  166.                         err := MyFSWriteAt(refnum, fsFromStart, dst, cnt, @buffer);
  167.                     end;
  168.                     src := src + cnt;
  169.                     dst := dst + cnt;
  170.                     len := len - cnt;
  171.                 end;
  172.             end;
  173.         end
  174.         else if err = eofErr then begin
  175.             err := SetEOF(refnum, 0);
  176.         end;
  177.         HistoryExpire := err;
  178.     end;
  179.  
  180. end.